AWS Amplify Gen1 で作成される S3 バケットにライフサイクルルールを追加してみた
いわさです。
AWS Amplify Gen1 ではバックエンドリソースを Amplify 上で管理することが出来ます。
amplify add storage
コマンドを使うことで、簡単に S3 バケットなどを追加することが出来るのですが、そのバケットをカスタマイズしたい場合はみなさんどうされていますでしょうか。
Amplify によってデプロイされた後にマネジメントコンソールからカスタマイズすることも出来るのですが、本日は Amplify コード上で S3 バケットのカスタマイズを行ってみましたのでその様子を紹介します。
Amplify Gen 2 で CDK ベースになったことでカスタマイズの柔軟性が上がったと言われていますが、実は Gen1 のころから CDK L1 ベースでのカスタマイズは出来ます。
カスタマイズ方法
実現方法ですがamplify override <category>
でリソースオーバーライド用のカスタムリソースを作成してやります。
ストレージであればamplify override storage
です。
そうすると、amplify/backend
フォルダのカテゴリごとにoverrides.ts
ファイルが生成されるので、そこにカスタマイズしたい内容を TypeScript ベースで実装します。
そしてamplify push
されたタイミングでそのカスタマイズコードがビルドされ、CloudFormation テンプレートがカスタマイズ内容で更新され、デプロイされるという流れです。
S3 バケットにライフサイクルルールを追加してみる
今回は S3 バケットにライフサイクルルールを追加してみたいと思います。
なお、実行環境はクリーンな環境で試したかったので Cloud9 を使っています。
割愛しますが、適当な React アプリケーションに Amplify をインストールし、S3 ストレージを追加してクラウドへのプッシュまで完了しています。
この時点での Amplify 管理のストレージはデフォルトでは次のようにライフサイクルルールは設定されていない状態です。
まずはamplify override storage
コマンドを実行します。
cm-iwasa.takahito:~/environment/vite-project $ amplify override storage
✅ Successfully generated "override.ts" folder at /home/ec2-user/environment/vite-project/amplify/backend/storage/s3beaa8e2b
✔ Do you want to edit override.ts file now? (Y/n) · yes
Could not find selected code editor (Visual Studio Code) on your machine.
? Try opening with system-default editor instead? Yes
Unable to open /home/ec2-user/environment/vite-project/amplify/backend/storage/s3beaa8e2b/override.ts: spawn xdg-open ENOENT
Have you installed `xdg-utils` on your machine?
? Press enter to continue
そうすると次のようにoverride.ts
というファイルが作成されると思います。
ここで L1 コンストラクトを操作してやることで Amplify が自動生成してデプロイする CloudFormation に反映されるようになります。
ここでは以下を参考にライフサイクルの構成を追加してみました。
import { AmplifyProjectInfo, AmplifyS3ResourceTemplate } from '@aws-amplify/cli-extensibility-helper';
export function override(resources: AmplifyS3ResourceTemplate, amplifyProjectInfo: AmplifyProjectInfo) {
resources.s3Bucket.lifecycleConfiguration = {
rules: [
{
status: 'Enabled',
id: 'hogerule1',
expirationInDays: 10,
prefix: '/'
}
]
}
}
定義したらamplify push
してやるだけです。これは中々良い感じだ。
cm-iwasa.takahito:~/environment/vite-project $ amplify push
✔ Successfully pulled backend environment dev from the cloud.
Current Environment: dev
┌──────────┬─────────────────────┬───────────┬───────────────────┐
│ Category │ Resource name │ Operation │ Provider plugin │
├──────────┼─────────────────────┼───────────┼───────────────────┤
│ Storage │ s3beaa8e2b │ Update │ awscloudformation │
├──────────┼─────────────────────┼───────────┼───────────────────┤
│ Auth │ viteproject64432aca │ No Change │ awscloudformation │
└──────────┴─────────────────────┴───────────┴───────────────────┘
✔ Are you sure you want to continue? (Y/n) · yes
Deployment completed.
Deploying root stack viteproject [ ===========================------------- ] 2/3
amplify-viteproject-dev-17fe4 AWS::CloudFormation::Stack UPDATE_IN_PROGRESS Wed Oct 30 2024 00:41:36…
storages3beaa8e2b AWS::CloudFormation::Stack UPDATE_COMPLETE Wed Oct 30 2024 00:42:14…
authviteproject64432aca AWS::CloudFormation::Stack UPDATE_COMPLETE Wed Oct 30 2024 00:41:43…
Deployed storage s3beaa8e2b [ ======================================== ] 7/7
S3Bucket AWS::S3::Bucket UPDATE_IN_PROGRESS Wed Oct 30 2024 00:41:44…
Deployment state saved successfully.
amplify push
を行うと、Amplify がバックエンドをデプロイするための CloudFormation テンプレートが自動生成されてデプロイされます。そのテンプレートを確認してみましょう。
{
"Description": "S3 Resource for AWS Amplify CLI",
"AWSTemplateFormatVersion": "2010-09-09",
:
"Resources": {
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": {
"Fn::If": [
"ShouldNotCreateEnvResources",
{
"Ref": "bucketName"
},
{
"Fn::Join": [
"",
[
{
"Ref": "bucketName"
},
{
"Fn::Select": [
3,
{
"Fn::Split": [
"-",
{
"Ref": "AWS::StackName"
}
]
}
]
},
"-",
{
"Ref": "env"
}
]
]
}
]
},
"CorsConfiguration": {
"CorsRules": [
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"*"
],
"ExposedHeaders": [
"x-amz-server-side-encryption",
"x-amz-request-id",
"x-amz-id-2",
"ETag"
],
"Id": "S3CORSRuleId1",
"MaxAge": 3000
}
]
},
"LifecycleConfiguration": {
"Rules": [
{
"ExpirationInDays": 10,
"Id": "hogerule1",
"Prefix": "/",
"Status": "Enabled"
}
]
}
},
"UpdateReplacePolicy": "Retain",
"DeletionPolicy": "Retain"
},
:
}
}
LifecycleConfiguration
が設定されていますね。良いぞ。
マネジメントコンソールからバケット構成も確認してみます。
ライフサイクルルールが設定されていますね。10 日になってます。
さいごに
本日は AWS Amplify Gen1 で作成される S3 バケットにライフサイクルルールを追加してみました。
Gen2 を使っている方ももう多いと思いますが、Gen1 で Amplify 生成リソースをもう少しカスタマイズしたい場合はこちらの方法も検討してみてください。